package com.lostreseditores.sabersai.presentation.backingBeans;

import java.util.ArrayList;
import java.util.List;
import java.util.TimeZone;

import javax.faces.model.SelectItem;

import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.component.selectonemenu.SelectOneMenu;
import org.primefaces.event.RowEditEvent;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.LazyDataModel;

import com.lostreseditores.sabersai.exceptions.ZMessManager;
import com.lostreseditores.sabersai.model.Colegio;
import com.lostreseditores.sabersai.model.Lugar;
import com.lostreseditores.sabersai.model.dto.ColegioDTO;
import com.lostreseditores.sabersai.presentation.businessDelegate.BusinessDelegatorView;
import com.lostreseditores.sabersai.utilities.ColegioLazyList;
import com.lostreseditores.sabersai.utilities.FacesUtils;


public class ColegioView {
	private InputText txtColecoddanen;
	private InputText txtColedescripv;
	private InputText txtLugaidn;
	private InputText txtColeidn;
	private CommandButton btnSave;
	private CommandButton btnModify;
	private CommandButton btnDelete;
	private CommandButton btnClear;
	private List<ColegioDTO> data;
	private SelectOneMenu cmbDpto = null;
	private SelectOneMenu cmbCiudad;
	private List<Lugar> listDpto = new ArrayList<Lugar>();
	private List<Lugar> listCiu = new ArrayList<Lugar>();
	private List<SelectItem> listCiudad;
	private String dptoSelect;
	private Integer ciuSelect;
	private String lugadescripv = "";
	private LazyDataModel<Colegio> lazyModel;
	private Colegio selectedColegio;

	public ColegioView() {
		super();
		FacesUtils.getSession().removeAttribute("lugaidn");
		System.out.println("ENTRO A CONSTRUCTOR DE COLEGIOVIEW!!!");
	}

	public LazyDataModel<Colegio> getAllColegios() {

		if (cmbCiudad.getValue() != null) {
			ciuSelect = Integer.parseInt(cmbCiudad.getValue().toString());
			if (ciuSelect == 0) {
				ciuSelect = null;
			}
			FacesUtils.getSession().setAttribute("lugaidn", ciuSelect);
		}

		if (lazyModel == null) {
			lazyModel = new ColegioLazyList();
		}
		return lazyModel;
	}

	public boolean validarCampos() {

		if (txtColedescripv.getValue().toString().equals("")
				|| cmbDpto.getValue().equals(0)
				|| cmbCiudad.getValue().equals(0)) {
			FacesUtils.addErrorMessage("Se deben llenar todos los campos.");
			return false;
		}

		return true;
	}

	public void rowEventListener(RowEditEvent e) {
		try {

			ColegioDTO colegioDTO = (ColegioDTO) e.getObject();

			if (txtColecoddanen == null) {
				txtColecoddanen = new InputText();
			}

			txtColecoddanen.setValue(colegioDTO.getColecoddanen());

			if (txtColedescripv == null) {
				txtColedescripv = new InputText();
			}

			txtColedescripv.setValue(colegioDTO.getColedescripv());

			if (txtLugaidn == null) {
				txtLugaidn = new InputText();
			}

			txtLugaidn.setValue(colegioDTO.getLugaidn());

			if (txtColeidn == null) {
				txtColeidn = new InputText();
			}
			txtColeidn.setValue(colegioDTO.getColeidn());
		} catch (Exception ex) {
		}
	}

	public String action_clear() {

		txtColecoddanen.setValue(null);
		txtColecoddanen.setDisabled(false);

		txtColedescripv.setValue(null);
		txtColedescripv.setDisabled(true);

		cmbDpto.setValue(0);
		cmbDpto.setDisabled(true);
		cmbCiudad.setValue(0);
		cmbCiudad.setDisabled(true);

		if (btnSave != null) {
			btnSave.setDisabled(false);
		}

		if (btnModify != null) {
			btnModify.setDisabled(true);
		}

		if (btnClear != null) {
			btnClear.setDisabled(false);
		}

		return "";
	}

	public void listener_txtDane() {
		Colegio entity = null;
		Lugar lug = null;

		try {
			Long coleDane = new Long(txtColecoddanen.getValue().toString());
			entity = BusinessDelegatorView.getColegioDane(coleDane);
		} catch (Exception e) {
			// TODO: handle exception
		}

		if (entity == null) {
			txtColedescripv.setValue(null);
			txtColedescripv.setDisabled(true);
			cmbDpto.setValue(0);
			cmbDpto.setDisabled(true);
			cmbCiudad.setValue(0);
			cmbCiudad.setDisabled(true);
			txtColecoddanen.setDisabled(false);
			txtColedescripv.setDisabled(false);
			cmbDpto.setDisabled(false);
			cmbCiudad.setDisabled(false);
			btnSave.setDisabled(false);
			btnModify.setDisabled(true);
			btnClear.setDisabled(false);
		} else {

			try {
				lug = BusinessDelegatorView.getLugarDane(entity.getLugaidn());
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			dptoSelect = lug.getLugar().getLugaidn().toString();
			ciuSelect = Integer.parseInt(lug.getLugacoddanen().toString());
			listener_CmbDpto();

			txtColecoddanen.setDisabled(false);
			txtColecoddanen.setValue(entity.getColecoddanen());
			txtColedescripv.setDisabled(false);
			txtColedescripv.setValue(entity.getColedescripv());
			cmbDpto.setValue(lug.getLugar().getLugaidn());
			cmbDpto.setDisabled(false);
			cmbCiudad.setValue(lug.getLugacoddanen());
			cmbCiudad.setDisabled(false);
			btnSave.setDisabled(true);
			btnModify.setDisabled(false);
			btnClear.setDisabled(false);
		}
	}

	public void listener_CmbDpto() {
		dptoSelect = cmbDpto.getValue().toString();

		System.out.println("DEPARTAMENTO" + dptoSelect);
		try {
			if (!dptoSelect.equals("0")) {
				listCiu = BusinessDelegatorView.getCiudades(Integer
						.parseInt(dptoSelect));
				if (listCiu != null && listCiu.size() > 0) {
					listCiudad = new ArrayList<SelectItem>();
					for (Lugar lugar : listCiu) {
						listCiudad.add(new SelectItem(lugar.getLugacoddanen(),
								lugar.getLugadescripv()));
					}
				}
			} else if (dptoSelect.equals("0")) {

				listCiudad.clear();
				ciuSelect = null;
				FacesUtils.getSession().setAttribute("lugaidn", null);

				getAllColegios();

			}
		} catch (NumberFormatException e) {
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public String action_save() {

		if (!validarCampos()) {
			return "";
		}

		String nombreColegio = txtColedescripv.getValue().toString()
				.toUpperCase();

		try {
			BusinessDelegatorView.saveColegio(
					FacesUtils.checkLong(txtColecoddanen), nombreColegio,
					ciuSelect.longValue());

			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED
					+ " DANE: " + txtColecoddanen.getValue().toString() + " - "
					+ "Nombre Colegio: " + nombreColegio);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}
		return "";
	}

	public String action_delete() {
		try {
			BusinessDelegatorView.deleteColegio(FacesUtils
					.checkInteger(txtColeidn));
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modify() {

		Colegio entity = null;

		Long coleDane = new Long(txtColecoddanen.getValue().toString());

		try {
			entity = BusinessDelegatorView.getColegioDane(coleDane);
		} catch (Exception e1) {
			e1.printStackTrace();
		}

		if (!validarCampos()) {
			return "";
		}

		String nombreColegio = txtColedescripv.getValue().toString()
				.toUpperCase();

		try {
			BusinessDelegatorView.updateColegio(entity.getColeidn(),
					FacesUtils.checkLong(txtColecoddanen), nombreColegio,
					ciuSelect.longValue());
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED
					+ " DANE: " + txtColecoddanen.getValue().toString() + " - "
					+ "Nombre Colegio: " + nombreColegio);
			action_clear();
		} catch (Exception e) {
			data = null;
			FacesUtils.addErrorMessage(e.getMessage());
		}
		return "";
	}

	public String actionDeleteDataTableEditable() {
		try {
			if (txtColeidn == null) {
				txtColeidn = new InputText();
			}

			txtColeidn.setValue(selectedColegio.getColeidn());

			BusinessDelegatorView.deleteColegio(FacesUtils
					.checkInteger(txtColeidn));
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
			action_clear();
			data.remove(selectedColegio);
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public InputText getTxtColecoddanen() {
		return txtColecoddanen;
	}

	public void setTxtColecoddanen(InputText txtColecoddanen) {
		this.txtColecoddanen = txtColecoddanen;
	}

	public InputText getTxtColedescripv() {
		return txtColedescripv;
	}

	public void setTxtColedescripv(InputText txtColedescripv) {
		this.txtColedescripv = txtColedescripv;
	}

	public InputText getTxtLugaidn() {
		return txtLugaidn;
	}

	public void setTxtLugaidn(InputText txtLugaidn) {
		this.txtLugaidn = txtLugaidn;
	}

	public InputText getTxtColeidn() {
		return txtColeidn;
	}

	public void setTxtColeidn(InputText txtColeidn) {
		this.txtColeidn = txtColeidn;
	}

	public List<ColegioDTO> getData() {
		try {
			if (data == null) {
				data = BusinessDelegatorView.getDataColegio();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return data;
	}

	public void setData(List<ColegioDTO> colegioDTO) {
		this.data = colegioDTO;
	}

	public CommandButton getBtnSave() {
		return btnSave;
	}

	public void setBtnSave(CommandButton btnSave) {
		this.btnSave = btnSave;
	}

	public CommandButton getBtnModify() {
		return btnModify;
	}

	public void setBtnModify(CommandButton btnModify) {
		this.btnModify = btnModify;
	}

	public CommandButton getBtnDelete() {
		return btnDelete;
	}

	public void setBtnDelete(CommandButton btnDelete) {
		this.btnDelete = btnDelete;
	}

	public CommandButton getBtnClear() {
		return btnClear;
	}

	public void setBtnClear(CommandButton btnClear) {
		this.btnClear = btnClear;
	}

	public List<SelectItem> getListCiudad() {
		return listCiudad;
	}

	public void setListCiudad(List<SelectItem> listCiudad) {
		this.listCiudad = listCiudad;
	}

	public TimeZone getTimeZone() {
		return java.util.TimeZone.getDefault();
	}

	public List<Lugar> getListDpto() {
		listCiu.clear();
		listDpto.clear();

		try {
			listDpto = BusinessDelegatorView.getDptos();

		} catch (Exception e) {
			// TODO: handle exception
		}
		return listDpto;
	}

	public void setListDpto(List<Lugar> listDpto) {
		this.listDpto = listDpto;
	}

	public List<Lugar> getListCiu() {
		return listCiu;
	}

	public void setListCiu(List<Lugar> listCiu) {
		this.listCiu = listCiu;
	}

	public String getDptoSelect() {
		return dptoSelect;
	}

	public void setDptoSelect(String dptoSelect) {
		this.dptoSelect = dptoSelect;
	}

	public Integer getCiuSelect() {
		return ciuSelect;
	}

	public void setCiuSelect(Integer ciuSelect) {
		this.ciuSelect = ciuSelect;
	}

	public SelectOneMenu getCmbDpto() {
		return cmbDpto;
	}

	public void setCmbDpto(SelectOneMenu cmbDpto) {
		this.cmbDpto = cmbDpto;
	}

	public SelectOneMenu getCmbCiudad() {
		return cmbCiudad;
	}

	public void setCmbCiudad(SelectOneMenu cmbCiudad) {
		this.cmbCiudad = cmbCiudad;
	}

	public LazyDataModel<Colegio> getLazyModel() {
		return lazyModel;
	}

	public void setLazyModel(LazyDataModel<Colegio> lazyModel) {
		this.lazyModel = lazyModel;
	}

	public Colegio getSelectedColegio() {

		if (selectedColegio != null) {
			System.out.println("Colegio Seleccionado (ColegioView): "
					+ selectedColegio.getColedescripv());
		}

		return selectedColegio;
	}

	public void setSelectedColegio(Colegio selectedColegio) {
		this.selectedColegio = selectedColegio;
	}

	public String getLugadescripv() {
		return lugadescripv;
	}

	public void setLugadescripv(String lugadescripv) {
		this.lugadescripv = lugadescripv;
	}

	public Colegio onRowSelect(SelectEvent event) {

		return selectedColegio;
	}
}